package com.curricula.usuario.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.curricula.usuario.vo.UsuarioVO;

/**
 * Clase para la el acceso a datos querys: insert, update, select y delete.
 * 
 * @author Carlos
 * @category Class DAO
 * 
 */
public class UsuarioDAO {
	static Logger log = Logger.getLogger(UsuarioDAO.class);
	
	/**
	 * Ejecucion del query con la sentencia INSERT invocada por el servicio UsuarioService
	 * 
	 * @author Hugo
	 * @param AficionVO aficionVO
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean insert(UsuarioVO usuarioVO, Connection conn)throws SQLException{
		boolean insertado = false;
		PreparedStatement ps=null;
		String sql = "INSERT INTO usuario (usr_id, usr_nick, usr_password, usr_tipo, usr_plantilla)"
					+ "VALUES (?,?,?,?,'1')";
		int i=1, rows;
		try{
			ps = conn.prepareStatement(sql);
			ps.setString(i++, String.valueOf(usuarioVO.getUsrId()));
			ps.setString(i++, usuarioVO.getUsrNick());
			ps.setString(i++, usuarioVO.getUsrPassword());
			ps.setString(i++, usuarioVO.getUsrTipo());

			log.info("Consulta insert: "+ sql);
			rows = ps.executeUpdate();			
			
			if(rows>0){
				log.info("Insertados: "+ rows+ " registros");
				insertado = true;				
			}else{
				log.error("No se pudieron insertar los registros");
			}			
		}catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return insertado;		
	}
	
	/**
	 * Ejecucion del query con la sentencia DELETE invocada por el servicio UsuarioService
	 * se le pasa como parametro dos enteros el id del registro a eliminar y el id
	 * del usuario del cual se quiere eliminar el registro.
	 * 
	 * @author Hugo
	 * @param int idAficion
	 * @param int idUser
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */	
	public static boolean delete(UsuarioVO filtro, Connection conn)throws SQLException{
		boolean eliminado=false;
		PreparedStatement ps = null;
		int rows;

		String sql = "DELETE FROM usuario WHERE 1=1";
		
		if(filtro.getUsrId()>0)
			sql+=" AND usr_id="+ filtro.getUsrId();
		if(filtro.getUsrNick()!= null && filtro.getUsrNick().trim().length()>0)
			 sql+=" AND usr_nick='"+ filtro.getUsrNick()+"'";
		if(filtro.getUsrPassword()!= null && filtro.getUsrPassword().trim().length()>0)
			sql+=" AND usr_password='"+ filtro.getUsrPassword()+"'";
		if(filtro.getUsrTipo()!= null && filtro.getUsrTipo().trim().length()>0)
			sql+=" AND usr_tipo='"+ filtro.getUsrTipo()+"'";
		
			try {
				ps = conn.prepareStatement(sql);			
				rows = ps.executeUpdate();
				log.info("Consulta delete: "+ sql);
				
				if(rows>0){
					log.info("Registro eliminado correctamente");
					eliminado=true;
				}else
				log.error("Error al tratar de eliminar registros");
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
				}			
		}
		return eliminado;
	}
	
	/**
	 * Ejecucion del query con la sentencia UPDATE invocada por el servicio UsuarioService
	 * se invoca con un parametro valor que tiene el nuevo VO a actualizar y un filtro
	 * que es el que cumplira la clausula de update.
	 * 
	 * @author Hugo
	 * @param AficionVO valor
	 * @param AficionVO filtro
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean update(UsuarioVO usuarioVO, Connection conn)throws SQLException{
		boolean actualizado = false;
		int i=1, rows;
		String sql="UPDATE usuario SET usr_nick=?, usr_password=?, usr_tipo=?, usr_plantilla=? WHERE usr_id=?";
		PreparedStatement ps = null;		
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(i++, usuarioVO.getUsrNick());
			ps.setString(i++, usuarioVO.getUsrPassword());
			ps.setString(i++, usuarioVO.getUsrTipo());
			ps.setString(i++, String.valueOf(usuarioVO.getUsrPlantilla()));
			ps.setString(i++, String.valueOf(usuarioVO.getUsrId()));
			
			rows = ps.executeUpdate();
			log.info("Consulta update: "+ sql);
			if(rows>0)
			{
				actualizado=true;
				log.info("Actualizados "+ rows + " registros");
			}
			else
				log.error("No se actualizo ningun registro");
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
				}
		}
		return actualizado;
	}
	
	/**
	 * Ejecucion del query con la sentencia SELECT invocada por el servicio UsuarioService,
	 * se invoca con un Vo que servira de filtro para obtener una lista con todos los elementos
	 * que cumplan la clausula del VO filtro.
	 * 
	 * @author Hugo
	 * @param AficionVO aficion
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static List<UsuarioVO> find(Object filter , Connection conn)throws SQLException{
		UsuarioVO filtro = (UsuarioVO)filter;
		List<UsuarioVO> listaUsuarios = new ArrayList<UsuarioVO>();
		String sql ="SELECT * FROM usuario WHERE 1=1";
		
		if(filtro.getUsrId()>0)
			sql+=" AND usr_id="+ filtro.getUsrId();
		if(filtro.getUsrNick()!= null && filtro.getUsrNick().trim().length()>0)
			 sql+=" AND usr_nick='"+ filtro.getUsrNick()+"'";
		if(filtro.getUsrPassword()!= null && filtro.getUsrPassword().trim().length()>0)
			sql+=" AND usr_password='"+ filtro.getUsrPassword()+"'";
		if(filtro.getUsrTipo()!= null && filtro.getUsrTipo().trim().length()>0)
			sql+=" AND usr_tipo='"+ filtro.getUsrTipo()+"'";
		if(filtro.getBuscar()!= null && filtro.getBuscar().trim().length()>0)
			sql+=" AND usr_nick like '%"+ filtro.getBuscar()+"%' OR usr_tipo like '%"+ filtro.getBuscar()+"%'";
		
		PreparedStatement ps = null;
		log.info("Consulta Find: "+ sql);

		try {
			ps = conn.prepareStatement(sql);			
			ResultSet rs = ps.executeQuery();
			
			if(rs.next()){
				do{
					UsuarioVO encontrado = new UsuarioVO();
			    	encontrado.setUsrId(rs.getInt("usr_id"));
			    	encontrado.setUsrNick(rs.getString("usr_nick"));
			    	encontrado.setUsrPassword(rs.getString("usr_password"));
			    	encontrado.setUsrTipo(rs.getString("usr_tipo"));
			    	encontrado.setUsrPlantilla(rs.getInt("usr_plantilla"));
			    	listaUsuarios.add(encontrado);
				}while(rs.next());
			}else
				listaUsuarios = null;
			
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}
		return listaUsuarios;		
	}
}